<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //【1】这个方法和工厂模式没有任何区别，只是函数名大写，而调用使用了new而工厂没有new。
        //而和构造函数区别是，在内部有new和return过程。
        function Person(name, age, job) {
            var o = new Object();
            o.name = name;
            o.age = age;
            o.job = job;
            o.sayName = function() {
                console.log(this.name);
            };
            return o;
        }
        var friend = new Person("Nicholas", 29, "Software Engineer");
        friend.sayName(); //"Nicholas"
        //【2】应用这个模式
        //业务场景：创建一个具有额外方法的特殊数组。由于不能直接修改 Array 构造函数，因此可以使用这个模式。
        function SpecialArray() {
            //创建数组
            var values = new Array();
            //添加值
            values.push.apply(values, arguments);
            //添加方法
            values.toPipedString = function() {
                return this.join("|");
            };

            //返回数组
            return values;
        }
        var colors = new SpecialArray("red", "blue", "green");
        console.log(colors.toPipedString()); //"red|blue|green"

        //【问题】
        // 首先， 返回的对象与构造函数或者与构造函数的原型属性之间没有关系； 也就是说， 
        // 构造函数返回的对象与在构造函数外部创建的对象没有什么不同。 为此，不能依赖 instanceof 操作符来确定对象类型。 
        // 由于存在上述问题， 我们建议在可以使用其他模式的情况下， 不要使用这种模式。
    </script>
</body>

</html>